package co.yixiang.modules.gen.service.mapper;

import co.yixiang.common.mapper.CoreMapper;
import co.yixiang.modules.gen.domain.ColumnConfig;
import co.yixiang.modules.gen.domain.vo.TableInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * ColumnInfoMapper接口用于数据库表结构信息的查询
 * 继承自CoreMapper，用于处理与ColumnConfig实体相关的数据库操作
 */
@Repository
@Mapper
public interface ColumnInfoMapper extends CoreMapper<ColumnConfig> {

    /**
     * 分页查询表信息
     * 根据表名模糊查询，并按照创建时间降序排列
     *
     * @param page 分页对象，用于封装分页信息
     * @param name 表名关键字，用于模糊匹配表名
     * @return 返回一个分页对象，包含查询到的表信息列表
     */
    @Select("<script>select table_name ,create_time , engine, table_collation as coding, table_comment as remark from information_schema.tables " +
            "where table_schema = (select database()) <if test=\"name!=null\"> and table_name like CONCAT('%',#{name},'%') </if> order by create_time desc</script>")
    IPage<TableInfo> selectTablePage(@Param("page") Page page, @Param("name") String name);

    /**
     * 查询所有表信息
     * 获取当前数据库下的所有表信息，并按照创建时间降序排列
     *
     * @return 返回一个列表，包含所有表的信息
     */
    @Select("<script>select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " +
            "where table_schema = (select database()) order by create_time desc</script>")
    List<TableInfo> selectTables();

    /**
     * 根据表名查询列信息
     * 获取指定表的所有列信息，包括列名、是否可为空、数据类型、列注释、列键和额外属性
     *
     * @param name 表名，用于查询列信息
     * @return 返回一个列表，包含查询到的列信息
     */
    @Select("SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, COLUMN_COMMENT, COLUMN_KEY, EXTRA FROM INFORMATION_SCHEMA.COLUMNS " +
            "WHERE TABLE_NAME = #{name} AND TABLE_SCHEMA = (SELECT DATABASE()) ORDER BY ORDINAL_POSITION")
    List<Map<String,Object>> queryByTableName(@Param("name") String name);

}

